package com.example.day3.exercise;

import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.Objects;

/**
 * 包含null值的排序
 */
public class Exercise4 {
    public static void main(String[] args) {
        // 创建一个包含null值的字符串列表
        List<String> listWithNulls = Arrays.asList("banana", null, "apple", "cherry", null, "date");

        System.out.println("原始列表: " + listWithNulls);
        /*
        nullsFirst方法
        1.处理 null 值: 包装传入的比较器,使其能够安全处理 null 值,避免 NullPointerException
        2.排序规则:
            将所有 null 元素排在最前面
            非 null 元素按照传入的比较器规则进行排序
        3.比较逻辑:
            如果两个元素都是 null,则认为相等
            如果只有一个元素是 null,则 null 元素排在前面
            如果两个元素都不是 null,则使用传入的比较器进行比较
         */
        
        /*
        naturalOrder方法
        1.返回自然排序比较器: 返回一个按照元素自然顺序进行排序的比较器
        2.适用于可比较类型: 只能用于实现了 Comparable 接口的类型,如:
            String (按字典序)
            Integer、Long、Double 等数字类型 (按数值大小)
            Date、LocalDate 等时间类型
            其他实现了 Comparable 接口的自定义类
        3.排序顺序: 按升序排列 (从小到大)
         */

        // 方法1: 将null值排在最前面
        List<String> sortedWithNullsFirst = listWithNulls.stream()
                // 创建一个比较器,将 null 值排在最前面,非 null 值按自然顺序升序排列。
                .sorted(Comparator.nullsFirst(Comparator.naturalOrder()))
                .toList();

        System.out.println("null值在前: " + sortedWithNullsFirst);

        // 方法2: 将null值排在最后面
        List<String> sortedWithNullsLast = listWithNulls.stream()
                // 创建一个比较器,将 null 值排在最后面,非 null 值按自然顺序升序排列。
                .sorted(Comparator.nullsLast(Comparator.naturalOrder()))
                .toList();

        System.out.println("null值在后: " + sortedWithNullsLast);

        // 方法3: 过滤掉null值后再排序
        List<String> sortedWithoutNulls = listWithNulls.stream()
                .filter(Objects::nonNull)
                .sorted()
                .toList();

        System.out.println("过滤null值: " + sortedWithoutNulls);

        // 方法4: 对数字排序,包含null值
        List<Integer> numbersWithNulls = Arrays.asList(5, null, 2, 8, null, 1, 9);

        List<Integer> sortedNumbers = numbersWithNulls.stream()
                // 创建一个比较器,将 null 值排在最后面,非 null 值按降序排列。
                .sorted(Comparator.nullsLast(Comparator.reverseOrder()))
                .toList();

        System.out.println("数字降序排列(null在后): " + sortedNumbers);
    }
}
